'use strict';

const Service = require('egg').Service;

class PosCategoryService extends Service {

  async page(params) {
    try {
      const { Op } = this.app.Sequelize;
      const offset = (Number(params.pi || 1) - 1) * Number(params.ps || 100);
      let queryCriteria = {
        type: params.type,
      };
      if (this.ctx.helper.isDef(params.status)) {
        queryCriteria = {
          ...queryCriteria,
          status: params.status,
        };
      }
      if (this.ctx.helper.isDef(params.keyword)) {
        queryCriteria = {
          ...queryCriteria,
          cateName: { [Op.like]: `%${params.keyword}%` }
        };
      }
      const query = {
        limit: Number(params.ps || 100),
        offset,
        distinct: true, //这一句可以去重，它返回的 count 不会把你的 include 的数量算进去
        where: queryCriteria,
      };
      const res = await this.ctx.model.PosCategory.findAndCountAll(query);
      return this.ctx.helper.ormSuccess(res);
    } catch (err) {
      return this.ctx.helper.ormError(err);
    }
  }

  // 获取指定类型下所有的分类
  async select(params) {
    try {
      const res = await this.ctx.model.PosCategory.findAll({
        where: {
          type: params.type
        },
      })
      return this.ctx.helper.ormSuccess(res);
    } catch (err) {
      return this.ctx.helper.ormError(err);
    }
  }

  /**
   * @description 创建分类
   * @param {PosCategoryDto.createDto} 参数
   */
  async create(params) {
    try {
      const { Op } = this.app.Sequelize;
      // 查询分类是否存在
      const existDate = await this.ctx.model.PosCategory.findOne({
        where: {
          type: params.type,
          cateName: params.cateName
        }
      })
      if (existDate) throw '分类名称已被使用';
      await this.ctx.model.PosCategory.create(params);
      return this.ctx.helper.ormSuccess();
    } catch (err) {
      return this.ctx.helper.ormError(err);
    }
  }


  /**
   * @description 编辑
   * @param {*} id id
   * @param {PosCategoryDto.editDto} 参数
   * @returns 
   */
  async edit(id, params) {
    try {
      const editEntity = await this.ctx.model.PosCategory.findByPk(id);
      if (!editEntity) throw '分类不存在';
      if (params.cateName) {
        let query = {
          where: {
            type: editEntity.type,
            cateName: params.cateName,
            id: {
              [Op.not]: id
            },
          },
        };
        const existData = await this.ctx.model.PosCategory.findOne(query);
        if (existData) throw '分类名称已被使用';
      }
      await editEntity.update(params);
      return this.ctx.helper.ormSuccess();
    } catch (err) {
      return this.ctx.helper.ormError(err);
    }
  }

  /**
   * @description 删除（逻辑删除）
   * @param {*} id 
   * @returns 
   */
  async del(id) {
    try {
      // TODO 这里要根据分类的类型判断对应的表是否有使用该分类，有使用不允许删除
      // const entity = await this.ctx.model.PosFolder.findByPk(id);
      // if (!entity) throw '分类不存在';
      // if (entity.isSys) throw '默认分类，不允许删除'
      // await this.ctx.model.PosFolder.destroy({
      //   where: {
      //     id
      //   }
      // })
      // if (entity.type === 1) {
      //   await this.ctx.model.PosPhoto.destroy({
      //     where: {
      //       folderId: id
      //     }
      //   })
      // }

      // if (entity.type === 2) {
      //   await this.ctx.model.PosVideo.destroy({
      //     where: {
      //       folderId: id
      //     }
      //   })
      // }
      // // TODO 删除oss资源
      // return this.ctx.helper.ormSuccess();
    } catch (err) {
      return this.ctx.helper.ormError(err);
    }
  }
}

module.exports = PosCategoryService;
